CodeFormater.cpp
Language: C++
Last Modified: 2022-08-18 12:03:02 AM UTC
File Size: 5976 bytes
Last Modified: 2022-08-18 12:03:02 AM UTC
File Size: 5976 bytes
http://www.penguinstew.ca/example/CodeFormater/CodeFormater.cpp
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <libxml/parser.h>
#include <libxml/tree.h>
#include "Line.h"
#include "State.h"
#include "Type.h"
#include "TypeCache.h"
#include "FormatHelper.h"
#include "PhpHelper.h"
#include "CodeParser.h"
#define TYPE_NAME "name"
#define TYPE_NUMBERS "numbers"
#define TYPE_ESCAPE "escape"
#define TYPE_STATES "states"
#define TYPE_SETS "sets"
#define TYPE_LANGS "langs"
#define BUFFER_LENGTH 1024
void Ussage();
bool FormatLines(std::vector<Line> lines, std::string outputPath, std::string header, bool noLines, bool noHeader);
int main(int argc, char* argv[])
{
std::string filePath;
std::string filename;
std::string outputPath;
std::string header;
std::string typeExt;
bool noLines = false;
bool noHeader = false;
bool sucess = false;
int start = 1;
int end = INT_MAX;
if (argc <= 1 || strcmp(argv[1], "?") == 0)
{
Ussage();
return -1;
}
filePath = std::string(argv[1]);
size_t lastSlash = filePath.find_last_of("\\/");
if (lastSlash == std::string::npos)
{
lastSlash = -1;
}
filename = filePath.substr(lastSlash + 1);
int extPos = filename.rfind('.');
typeExt = filename.substr(extPos + 1);
outputPath = filename.substr(0, extPos);
outputPath.append(".html");
header = filename;
for (int i = 2; i < argc; i++)
{
if (strcmp(argv[i], "/nolines") == 0)
{
noLines = true;
}
else if (strcmp(argv[i], "/noheader") == 0)
{
noHeader = true;
}
else if (strcmp(argv[i], "/output") == 0)
{
if (i + 1 < argc)
{
outputPath = argv[i + 1];
i++;
}
else
{
std::cout << "/output missing argument" << std::endl;
Ussage();
return -1;
}
}
else if (strcmp(argv[i], "/header") == 0)
{
if (i + 1 < argc)
{
header = argv[i + 1];
i++;
}
else
{
std::cout << "/header missing argument" << std::endl;
Ussage();
return -1;
}
}
else if (strcmp(argv[i], "/start") == 0)
{
if (i + 1 < argc)
{
start = atoi(argv[i + 1]);
if (start <= 0)
{
std::cout << "/start must be a number greater than or equal to 1" << std::endl;
Ussage();
return -1;
}
i++;
}
else
{
std::cout << "/start missing argument" << std::endl;
Ussage();
return -1;
}
}
else if (strcmp(argv[i], "/end") == 0)
{
if (i + 1 < argc)
{
end = atoi(argv[i + 1]);
if (end <= 0)
{
std::cout << "/end must be a number greater than or equal to 1" << std::endl;
Ussage();
return -1;
}
i++;
}
else
{
std::cout << "/end missing argument" << std::endl;
Ussage();
return -1;
}
}
else if (strcmp(argv[i], "/type") == 0)
{
if (i + 1 < argc)
{
typeExt = argv[i + 1];
i++;
}
else
{
std::cout << "/type missing argument" << std::endl;
Ussage();
return -1;
}
}
else
{
std::cout << "Unknown argument: " << argv[i] << std::endl;
Ussage();
return -1;
}
}
if (end < start)
{
std::cout << "/end less than /start" << std::endl;
Ussage();
return -1;
}
std::cout << "Parsing input file (" << filePath << ")" << std::endl;
CodeParser codePoarse;
std::vector<Line> lines = codePoarse.ParseLines(filePath, typeExt, start, end);
if (lines.size() > 0)
{
std::cout << "Generating output file (" << outputPath << ")" << std::endl;
sucess = FormatLines(lines, outputPath, header, noLines, noHeader);
}
xmlCleanupParser();
if (sucess)
{
std::cout << "Successfully generated file" << std::endl;
}
return 0;
}
void Ussage()
{
std::cout << "Filepath [/nolines] [/noheader] [/header HeaderText] [/output OutputPath] [/start StartLine] [/end EndLine] [/type TypeName]" << std::endl;
std::cout << "Filepath\t\tThe path to the file to format" << std::endl;
std::cout << "/nolines\t\tOutput won't include line numbers" << std::endl;
std::cout << "/noheader\t\tOutput won't include header" << std::endl;
std::cout << "/header HeaderText\tDisplays HeaderText in the output header instead of the name of the file" << std::endl;
std::cout << "/output OutputPath\tSaves the output to OutputPath instead of the Filepath with the extension changed to html" << std::endl;
std::cout << "/start StartLine\tStart outputting at StartLine instead of the beginning of the file" << std::endl;
std::cout << "/end EndLine\t\tEnd outputting at EndLine (inclusive) instead of the end of the file" << std::endl;
std::cout << "/type TypeName\t\tSpecifies the type to use instead of basing it on the file extension" << std::endl;
}
bool FormatLines(std::vector<Line> lines, std::string outputPath, std::string header, bool noLines, bool noHeader)
{
FILE* f;
fopen_s(&f, outputPath.c_str(), "w");
if (f == NULL)
{
std::cout << "Error Generating output file: " << outputPath << std::endl;
return false;
}
if (!noHeader)
{
fputs("<div class = \"codeHeadCell\">", f);
fputs(header.c_str(), f);
fputs("</div>\n", f);
}
fputs("<div class=\"codeOuter2\">\n", f);
if (noLines)
{
fputs("\t<div class=\"codeTextOuterFull\">\n", f);
}
else
{
fputs("\t<div class=\"codeTextOuter\">\n", f);
}
unsigned int firstLine = 0;
unsigned int lastLine = lines.size();
bool first = true;
for (unsigned int i = firstLine; i < lastLine; i++)
{
Line l = lines.at(i);
fputs(l.FormatContent(first).c_str(), f);
first = false;
}
fputs("\t</div>\n", f);
if (!noLines)
{
fputs("\t<div class=\"codeCountOuter\">\n", f);
first = true;
for (unsigned int i = firstLine; i < lastLine; i++)
{
Line l = lines.at(i);
fputs(l.FormatNumber(first).c_str(), f);
first = false;
}
fputs("\t</div>\n", f);
}
fputs("</div>\n", f);
return true;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260